home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / news / inn1.000 / inn1.4sec-linux-src.tar / inn / samples / nntpsend < prev    next >
Text File  |  1993-01-29  |  6KB  |  279 lines

  1. #! /bin/sh
  2. ##  $Revision: 1.8 $
  3. ##  Send news via NNTP by running several innxmit processes in the background.
  4. ##  Usage:
  5. ##    nntpsend [-p][-r][-s size][-S][-t timeout][-T limit][host fqdn]...
  6. ##    -p        Run innxmit with -p to prune batch files
  7. ##    -r        innxmit, don't requeue on unexpected error code
  8. ##    -s size        limit the .nntp file to size bytes
  9. ##    -S        send via xreplic protocol (send to a slave site)
  10. ##    -t timeout    innxmit timeout to make connection (def: 180)
  11. ##    -T limit    innxmit connection transmit time limit (def: forever)
  12. ##    host fqdn    send to host and qualified domain (def: nntpsend.ctl)
  13. ##  If no "host fqdn" pairs appear on the command line, then ${CTLFILE}
  14. ##  file is read.
  15. ##  =()<. @<_PATH_SHELLVARS>@>()=
  16. . /news/lib/innshellvars
  17.  
  18. PROGNAME=`basename $0`
  19. LOCK=${LOCKS}/LOCK.${PROGNAME}
  20. CTLFILE=${NEWSLIB}/${PROGNAME}.ctl
  21. LOG=${MOST_LOGS}/${PROGNAME}.log
  22.  
  23. ##  Set defaults.
  24. D_FLAG=
  25. P_FLAG=
  26. R_FLAG=
  27. S_FLAG=
  28. TRUNC_SIZE=
  29. T_FLAG=
  30. TIMELIMIT=
  31.  
  32. ##  Parse JCL.
  33. MORETODO=true
  34. while ${MORETODO} ; do
  35.     case X"$1" in
  36.     X-d)
  37.     D_FLAG="-d"
  38.     ;;
  39.     X-p)
  40.     P_FLAG="-p"
  41.     ;;
  42.     X-r)
  43.     R_FLAG="-r"
  44.     ;;
  45.     X-S)
  46.     S_FLAG="-S"
  47.     ;;
  48.     X-s)
  49.     if [ -z "$2" ] ; then
  50.         echo "${PROGNAME}: option requires an argument -- s" 1>&2
  51.         exit 1
  52.     fi
  53.     TRUNC_SIZE="$2"
  54.     shift
  55.     ;;
  56.     X-s*)
  57.     TRUNC_SIZE="`echo $2 | ${SED} -e 's/-s//'`"
  58.     ;;
  59.     X-t)
  60.     if [ -z "$2" ] ; then
  61.         echo "${PROGNAME}: option requires an argument -- t" 1>&2
  62.         exit 1
  63.     fi
  64.     T_FLAG="-t$2"
  65.     shift
  66.     ;;
  67.     X-t*)
  68.     T_FLAG="$1"
  69.     ;;
  70.     X-T)
  71.     if [ -z "$2" ] ; then
  72.         echo "${PROGNAME}: option requires an argument -- T" 1>&2
  73.         exit 1
  74.     fi
  75.     TIMELIMIT="-T$2"
  76.     shift
  77.     ;;
  78.     X-T*)
  79.     TIMELIMIT="$1"
  80.     ;;
  81.     X--)
  82.     shift
  83.     MORETODO=false
  84.     ;;
  85.     X-*)
  86.     echo "${PROGNAME}: illegal option -- $1" 1>&2
  87.     exit 1
  88.     ;;
  89.     *)
  90.     MORETODO=false
  91.     ;;
  92.     esac
  93.     ${MORETODO} && shift
  94. done
  95.  
  96. ##  Parse arguments; host/fqdn pairs.
  97. INPUT=${TMPDIR}/nntpsend$$
  98. cp /dev/null ${INPUT}
  99. while [ $# -gt 0 ]; do
  100.     if [ $# -lt 2 ]; then
  101.     echo "${PROGNAME}:  Bad host/fqdn pair" 1>&2
  102.     exit 1
  103.     fi
  104.     echo "$1 $2" >>${INPUT}
  105.     shift
  106.     shift
  107. done
  108.  
  109. ##  If nothing specified on the command line, read the control file.
  110. if [ ! -s ${INPUT} ] ; then
  111.     if [ ! -r ${CTLFILE} ]; then
  112.     echo "${PROGNAME}: cannot read ${CTLFILE}"
  113.     exit 1
  114.     fi
  115.     ${SED} -e 's/#.*//' -e '/^$/d' -e 's/::\([^:]*\)$/:max:\1/' \
  116.     -e 's/:/ /g' <${CTLFILE} >${INPUT}
  117. fi
  118.  
  119. ##  Go to where the action is.
  120. if [ ! -d ${BATCH} ]; then
  121.     echo "${PROGNAME}: directory ${BATCH} not found" 1>&2
  122.     exit 1
  123. fi
  124. cd ${BATCH}
  125.  
  126. ##  Set up log file.
  127. umask 002
  128. if [ -z "${D_FLAG}" ]; then
  129.     test ! -f ${LOG} && touch ${LOG}
  130.     chmod 0660 ${LOG}
  131.     exec >>${LOG} 2>&1
  132. fi
  133. PPID=$$
  134. echo "${PROGNAME}: [${PPID}] start"
  135.  
  136. ##  Set up environment.
  137. export BATCH PROGNAME PPID INNFLAGS
  138.  
  139. ##  Loop over all sites.
  140. cat ${INPUT} | while read SITE HOST MAXSIZE FLAGS; do
  141.     ## Parse the input parameters.
  142.     if [ -z "${SITE}" -o -z "${HOST}" ] ; then
  143.     echo "Ignoring bad line: ${SITE} ${HOST} ${MAXSIZE} ${FLAGS}" 1>&2
  144.     continue
  145.     fi
  146.     test "${MAXSIZE}" = "max" && MAXSIZE=
  147.  
  148.     ## Compute the specific parameters for this site.
  149.     if [ -n "${TRUNC_SIZE}" ]; then
  150.     SIZE="${TRUNC_SIZE}"
  151.     else
  152.     SIZE="${MAXSIZE}"
  153.     fi
  154.     D_PARAM=
  155.     R_PARAM=
  156.     S_PARAM=
  157.     TIMEOUT_PARAM=
  158.     TIMELIMIT_PARAM=
  159.     if [ -z "${FLAGS}" ]; then
  160.     MORETODO=false
  161.     else
  162.     MORETODO=true
  163.     set - ${FLAGS}
  164.     fi
  165.     while ${MORETODO} ; do
  166.     case "X$1" in
  167.     X-a)
  168.         ;;
  169.     X-d)
  170.         D_PARAM="-d"
  171.         ;;
  172.     X-p)
  173.         P_PARAM="-p"
  174.         ;;
  175.     X-r)
  176.         R_PARAM="-r"
  177.         ;;
  178.     X-S)
  179.         S_PARAM="-S"
  180.         ;;
  181.     X-t)
  182.         if [ -z "$2" ] ; then
  183.         echo "${PROGNAME}: option requires an argument -- t" 1>&2
  184.         exit 1
  185.         fi
  186.         TIMEOUT_PARAM="-t$2"
  187.         shift
  188.         ;;
  189.     X-t*)
  190.         TIMEOUT_PARAM="$1"
  191.         ;;
  192.     X-T)
  193.         if [ -z "$2" ] ; then
  194.         echo "${PROGNAME}: option requires an argument -- T" 1>&2
  195.         exit 1
  196.         fi
  197.         TIMELIMIT_PARAM="-T$2"
  198.         shift
  199.         ;;
  200.     X-T*)
  201.         TIMELIMIT_PARAM="$1"
  202.         ;;
  203.     *)
  204.         MORETODO=false
  205.         ;;
  206.     esac
  207.     ${MORETODO} && shift
  208.     done
  209.     INNFLAGS="-a"
  210.     if [ -n "${D_FLAG}" ]; then
  211.     INNFLAGS="${INNFLAGS} ${D_FLAG}"
  212.     else
  213.     test -n "${D_PARAM}" && INNFLAGS="${INNFLAGS} ${D_PARAM}"
  214.     fi
  215.     if [ -n "${P_FLAG}" ]; then
  216.     INNFLAGS="${INNFLAGS} ${P_FLAG}"
  217.     else
  218.     test -n "${P_PARAM}" && INNFLAGS="${INNFLAGS} ${P_PARAM}"
  219.     fi
  220.     if [ -n "${R_FLAG}" ]; then
  221.     INNFLAGS="${INNFLAGS} ${R_FLAG}"
  222.     else
  223.     test -n "${R_PARAM}" && INNFLAGS="${INNFLAGS} ${R_PARAM}"
  224.     fi
  225.     if [ -n "${S_FLAG}" ]; then
  226.     INNFLAGS="${INNFLAGS} ${S_FLAG}"
  227.     else
  228.     test -n "${S_PARAM}" && INNFLAGS="${INNFLAGS} ${S_PARAM}"
  229.     fi
  230.     if [ -n "${T_FLAG}" ]; then
  231.     INNFLAGS="${INNFLAGS} ${T_FLAG}"
  232.     else
  233.     test -n "${TIMEOUT_PARAM}" && INNFLAGS="${INNFLAGS} ${TIMEOUT_PARAM}"
  234.     fi
  235.     if [ -n "${TIMELIMIT}" ]; then
  236.     INNFLAGS="${INNFLAGS} ${TIMELIMIT}"
  237.     else
  238.     test -n "${TIMELIMIT_PARAM}" \
  239.         && INNFLAGS="${INNFLAGS} ${TIMELIMIT_PARAM}"
  240.     fi
  241.  
  242.     ##  Start sending this site in the background.
  243.     export SITE HOST LOCKS BATCHFILE PROGNAME PPID SIZE TMPDIR
  244.     sh -c '
  245.     BATCHFILE=${HOST}.nntp
  246.     LOCK=${LOCKS}/LOCK.${HOST}
  247.     trap "rm -f ${LOCK} ; exit 1" 1 2 3 15
  248.     shlock -p $$ -f ${LOCK} || {
  249.         WHY="`cat ${LOCK}`"
  250.         echo "${PROGNAME}: [${PPID}:$$] ${HOST} locked ${WHY} `date`"
  251.         exit
  252.     }
  253.     if [ -f ${SITE}.work ] ; then
  254.         cat ${SITE}.work >>${BATCHFILE}
  255.         rm -f ${SITE}.work
  256.     fi
  257.     mv ${SITE} ${SITE}.work
  258.     if ctlinnd -s -t30 flush ${SITE} ; then
  259.         cat ${SITE}.work >>${BATCHFILE}
  260.         rm -f ${SITE}.work
  261.         test -n "${SIZE}" && shrinkfile -s${SIZE} -v ${BATCHFILE}
  262.         if [ -s ${BATCHFILE} ] ; then
  263.         echo "${PROGNAME}: [${PPID}:$$] begin ${HOST} `date`"
  264.         echo "${PROGNAME}: [${PPID}:$$] innxmit ${INNFLAGS} ${HOST} ..."
  265.         eval innxmit ${INNFLAGS} ${HOST} ${BATCH}/${BATCHFILE}
  266.         echo "${PROGNAME}: [${PPID}:$$] end ${HOST} `date`"
  267.         else
  268.         rm -f ${BATCHFILE}
  269.         fi
  270.     fi
  271.     rm -f ${LOCK}
  272.     ' &
  273.     sleep 5
  274. done
  275.  
  276. wait
  277. rm -f ${INPUT}
  278. echo "${PROGNAME}: [${PPID}] stop"
  279.